﻿using System;
using System.Collections;
using System.Collections.Generic;
using Iesi.Collections.Generic;
using System.Linq;

using NHibernate;

using Pink.Scheduler.DataAccess.MetadataInfo;

namespace Pink.Scheduler.DataAccess
{

    /// <summary>
    /// Элемент очереди выполнения задач
    /// </summary>
	[Serializable]
	public partial class TaskExecution : ICloneable
	{
		#region Конструкторы
		
        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>
		public TaskExecution() : base()
        {
        }

		#endregion

		

		#region Копирование
		
        object ICloneable.Clone() { return this.Clone(); }

        /// <summary>
        /// Клонировать объект - глубокое копирование
        /// </summary>
        /// <returns>Клонированный объект</returns>
        public virtual TaskExecution Clone()
        {
            var result = new TaskExecution();
            this.CloneTo(result, null, null);
            return result;
        }

        /// <summary>
        /// CheckNeedCopy - вспомогательный метод
        /// </summary>
        /// <returns></returns>
        public virtual TaskExecution CheckNeedCopy(int? level, Hashtable list)
        {
            if (!(level == null || level > 0))
                return null;
            if (list.Contains(this))
                return (TaskExecution)list[this];
            var result = new TaskExecution();
            list.Add(this, result);
            this.CloneTo(result, level - 1, list);
            return result;
        }

        /// <summary>
        /// Клонировать объект - глубоко скопировать текущий объект в выбранный
        /// </summary>
        /// <param name="target">куда копируем</param>
        /// <param name="level">уровень глубины копии</param>
        /// <param name="list">хеш копируемых объектов</param>
        public virtual void CloneTo(TaskExecution target, int? level, Hashtable list)
        {
            if (list == null)
                list = new Hashtable();
            var result = target as TaskExecution;
            if (result == null)
                return;
            result.ID = this.ID;
            result.State = this.State;
            result.StartTime = this.StartTime;
            result.UpdatedAt = this.UpdatedAt;
            result.IsManual = this.IsManual;
            result.Initiator = this.Initiator;
            result.RetryCount = this.RetryCount;
            result.Task = this.Task == null ? null : (TaskData)this.Task.CheckNeedCopy(level, list);
        }

		
		#endregion		
		
		#region Properties
		
        /// <summary>
        /// Идентификатор записи
        /// </summary>
        public const string IDProp = "ID";
        /// <summary>
        /// Идентификатор записи
        /// </summary>
        public virtual int ID
        {
            get; set;
        }
        /// <summary>
        /// Ссылка на задачу события
        /// </summary>
        public const string TaskProp = "Task";
        /// <summary>
        /// Ссылка на задачу события
        /// </summary>
        public virtual TaskData Task
        {
            get; set;
        }
        /// <summary>
        /// Результат последнего запуска по этому расписанию
        /// </summary>
        public const string StateProp = "State";
        /// <summary>
        /// Результат последнего запуска по этому расписанию
        /// </summary>
        public virtual Pink.Scheduler.RemoteInterfaces.Enum.ExecutionState State
        {
            get; set;
        }
        /// <summary>
        /// Время начала выполнения
        /// </summary>
        public const string StartTimeProp = "StartTime";
        /// <summary>
        /// Время начала выполнения
        /// </summary>
        public virtual DateTime StartTime
        {
            get; set;
        }
        /// <summary>
        /// Время последнего обновления для определения зависших задач
        /// </summary>
        public const string UpdatedAtProp = "UpdatedAt";
        /// <summary>
        /// Время последнего обновления для определения зависших задач
        /// </summary>
        public virtual DateTime UpdatedAt
        {
            get; set;
        }
        /// <summary>
        /// Запуск вручную?
        /// </summary>
        public const string IsManualProp = "IsManual";
        /// <summary>
        /// Запуск вручную?
        /// </summary>
        public virtual bool IsManual
        {
            get; set;
        }
        /// <summary>
        /// Кто запустил в случае ручного запуска
        /// </summary>
        public const string InitiatorProp = "Initiator";
        /// <summary>
        /// Кто запустил в случае ручного запуска
        /// </summary>
        public virtual string Initiator
        {
            get; set;
        }
        /// <summary>
        /// Сколько было сделано повторных попыток
        /// </summary>
        public const string RetryCountProp = "RetryCount";
        /// <summary>
        /// Сколько было сделано повторных попыток
        /// </summary>
        public virtual int RetryCount
        {
            get; set;
        }		
		#endregion
	}
		
    /// <summary>
    /// Метаданные маппинга
    /// </summary>
	public partial class Metadata
	{
			
        /// <summary>
        /// Элемент очереди выполнения задач (Метаданные)
        /// </summary>
        public class TaskExecutionMetadata : Class
		{
		
            /// <summary>
            /// Конструктор по умолчанию
            /// </summary>
            public TaskExecutionMetadata() : 
				base("TaskExecution", "SCHEDULER_TASK_EXECUTION") {}
		
		
            /// <summary>
            /// Конструктор
            /// </summary>
            public TaskExecutionMetadata(string className, string tableName) : base(className, tableName) {}
		

			#region Properties
			
            /// <summary>
            /// 
            /// </summary>
            public readonly Property ID = new Property("ID", "ID", typeof(int), null, true);
            /// <summary>
            /// Результат последнего запуска по этому расписанию
            /// </summary>
            public readonly Property State = new Property("State", "STATE", typeof(Pink.Scheduler.RemoteInterfaces.Enum.ExecutionState), null, true);
            /// <summary>
            /// Время начала выполнения
            /// </summary>
            public readonly Property StartTime = new Property("StartTime", "START_TIME", typeof(DateTime), null, true);
            /// <summary>
            /// Время последнего обновления для определения зависших задач
            /// </summary>
            public readonly Property UpdatedAt = new Property("UpdatedAt", "UPDATED_AT", typeof(DateTime), null, true);
            /// <summary>
            /// Запуск вручную?
            /// </summary>
            public readonly Property IsManual = new Property("IsManual", "IS_MANUAL", typeof(bool), null, true);
            /// <summary>
            /// Кто запустил в случае ручного запуска
            /// </summary>
            public readonly Property Initiator = new Property("Initiator", "INITIATOR", typeof(string), 50, false);
            /// <summary>
            /// Сколько было сделано повторных попыток
            /// </summary>
            public readonly Property RetryCount = new Property("RetryCount", "RETRY_COUNT", typeof(int), null, true);
            /// <summary>
            /// Индексатор
            /// </summary>
            /// <param name="propertyName">Имя свойтсва</param>
            /// <returns>Метаданные</returns>
			public override Property this[string propertyName]
			{
				get
				{
					switch (propertyName)
					{
                        case "ID": return ID;
                        case "State": return State;
                        case "StartTime": return StartTime;
                        case "UpdatedAt": return UpdatedAt;
                        case "IsManual": return IsManual;
                        case "Initiator": return Initiator;
                        case "RetryCount": return RetryCount;
						default: return base[propertyName];
					}
				}
			}
			#endregion
		}			
		
		
        /// <summary>
        /// Элемент очереди выполнения задач
        /// </summary>
        public static TaskExecutionMetadata TaskExecution = new TaskExecutionMetadata();		
		
	}	
	
}